package com.distribution.system.utils;

import com.distribution.common.utils.uuid.UUID;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.FileSystems;
import java.nio.file.Path;

/**
 * @author Liping Huo
 * @date 2023/5/22 18:00
 */
public class TwoDimensionalCodeUtil {

    public static final String QR_CODE_PNG = "PNG";
    public static final String QR_CODE_JPG = "JPG";
    public static final String DIT = ".";

    /**
     * 生成发送二维码方法
     *
     * @param text     二维码生成规则(二维码可以是任何英文字母加数字生成的二维码)
     * @param width    宽度
     * @param height   高度
     * @param filePath 输出图片地址
     */
    public void getTwoDimensionalCodeImageToFile(String text, int width, int height, String filePath) throws WriterException, IOException {
        BitMatrix bitMatrix = getBitMatrix(text, width, height);
        //生成图片唯一名称,加上.png格式
        String pat = getUUID() + DIT + QR_CODE_PNG;
        //图片路劲加上图片名称  (输出地址)
        filePath += pat;
        Path path = FileSystems.getDefault().getPath(filePath);
        //输出二维码图片
        MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);

    }


    /**
     * 生成发送二维码方法
     *
     * @param text   二维码生成规则(二维码可以是任何英文字母加数字生成的二维码)
     * @param width  宽度
     * @param height 高度
     * @param stream 输出图片地址
     */
    public static OutputStream getTwoDimensionalCodeImageToStream(String text, int width, int height, OutputStream stream) throws WriterException, IOException {
        BitMatrix bitMatrix = getBitMatrix(text, width, height);
        MatrixToImageWriter.writeToStream(bitMatrix, "PNG", stream);
        return stream;
    }


    private static BitMatrix getBitMatrix(String text, int width, int height) throws WriterException {
        //生成二维码类
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        //生成的二维码
        return qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height);
    }

    /**
     * 把String自带的UUID去除下划线返回
     *
     * @return String UUID
     */
    private static String getUUID() {
        String s = UUID.randomUUID().toString();
        //去掉“-”符号
        return s.substring(0, 8) + s.substring(9, 13) + s.substring(14, 18) + s.substring(19, 23) + s.substring(24);
    }


}